package com.qfmy.common.utils;

import org.apache.commons.codec.digest.DigestUtils;

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @ClassName: Md5Utils
 * @author： zhengjt
 * @data： 2022/6/23 16:43
 * @version：1.0
 * @描述：
 */
public class Md5Utils {

    public static final String MD5_SECRET = "SKY_BASE_MD5";

    public static void main(String[] args) throws Exception {
        String data = "admin123";
        String md5 = encryptDefaultSecret(data);
        //  192023a7bbd73250516f069df18b500
        //  192023a7bbd73250516f069df18b500
        System.out.println(md5);

        System.out.println(verifySecret(data, MD5_SECRET, "bbfe80428f41497cd9c4572ad66e6f9f"));

        //  bbfe80428f41497cd9c4572ad66e6f9f
    }

    /**
     * md5加密
     * @param data  明文数据
     * @return  MD5密文
     * @throws Exception
     */
    public static String encode(String data) throws Exception{
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        messageDigest.update(data.getBytes(StandardCharsets.UTF_8));
        byte[] bytes = messageDigest.digest();
        return new BigInteger(1, bytes).toString(16);
    }

    /**
     * MD5加盐加密
     * @param data  明文数据
     * @param secret    盐值
     * @return  MD5密文
     * @throws Exception
     */
    public static String encryptSecret(String data, String secret) throws Exception{
        data = data + secret;
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        messageDigest.update(data.getBytes(StandardCharsets.UTF_8));
        byte[] bytes = messageDigest.digest();
        return new BigInteger(1, bytes).toString(16);
    }

    /**
     * MD5默认盐值加密
     * @param data  明文数据
     * @return  MD5密文
     * @throws Exception
     */
    public static String encryptDefaultSecret(String data) throws Exception{
        data = data + MD5_SECRET;
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        messageDigest.update(data.getBytes(StandardCharsets.UTF_8));
        byte[] bytes = messageDigest.digest();
        return new BigInteger(1, bytes).toString(16);
    }

    /**
     * MD5值校验
     * @param data  明文
     * @param secret    盐值
     * @param md5Str    md5密文
     * @return  true | false
     * @throws Exception
     */
    public static boolean verifySecret(String data, String secret, String md5Str) throws Exception{
        String md5String = encryptSecret(data, secret);
        if (md5String.equals(md5Str)){
            return true;
        }
        return false;
    }

    /**
     * MD5加密（采用DigestUtils工具类）
     * @param data  明文数据
     * @return  MD5密文
     */
    public static String encryptDigest(String data){
        return DigestUtils.md5Hex(data);
    }

}
